package com.atguigu.sparkstreaming.apps

import org.apache.spark.streaming.StreamingContext

import scala.util.control.Breaks

/**
 * Created by Smexy on 2022/7/18
 *
 * BaseApp： 把编写一个SparkStreamingApp的一般步骤抽象出来。
 *    不同的业务类，只需要继承BaseApp，就可以拥有编程的一般步骤，无需重复编写。
 *    BaseApp自己没有实例化意义，给子类继承。
 *
 *
 *  StreamingContext:
 *        masterurl
 *        appName
 *        batchDuration:
 */
abstract class BaseApp {

  //只声明，未赋值。 抽象属性。 只有抽象类才能声明抽象属性
  var groupId:String

  var topic:String

  var appName:String

  var batchDuration:Int

  //由子类取overwrite(覆写)，子类可以根据自己的appName,自己的batchDuration去创建自己的StreamingContext
  var context:StreamingContext = null

  def runApp(code: => Unit)={

    try {
      //将②③④作为参数传入
      code
       context.start()
       context.awaitTermination()
    } catch {
      case ex: Exception =>
        ex.printStackTrace()
        throw new RuntimeException("运行出错!")
    }



  }

}
